﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace Itfort.UserCenter
{
	/// <summary>
	/// 用户服务实现。
	/// </summary>
	public class UserService : IUserService
	{
		private EdmEntities.Itfort_UserCenter_Entities db = new EdmEntities.Itfort_UserCenter_Entities();

		/// <summary>
		/// 创建用户。
		/// </summary>
		/// <param name="username">用户名。</param>
		/// <param name="password">密码。</param>
		/// <param name="email">电子邮箱。</param>
		/// <returns>新创建的用户的信息填充的User对象。</returns>
		/// <exception cref="UCExceiption"></exception>
		public User CreateUser(String username, String password, String email)
		{
			return this.CreateUser(username, password, email, "", false, false);
		}

		/// <summary>
		/// 创建用户。
		/// </summary>
		/// <param name="email">电子邮箱。</param>
		/// <param name="password">密码。</param>
		/// <returns>新创建的用户的信息填充的User对象。</returns>
		/// <exception cref="UCExceiption"></exception>
		public User CreateUserByEmail(String email, String password)
		{
			return this.CreateUser("", password, email, "", true, false);
		}

		/// <summary>
		/// 创建用户。
		/// </summary>
		/// <param name="mobile">手机号码。</param>
		/// <param name="password">密码。</param>
		/// <returns>新创建的用户的信息填充的User对象。</returns>
		/// <exception cref="UCExceiption"></exception>
		public User CreateUserByMobile(String mobile, String password)
		{
			return this.CreateUser("", password, "", mobile, false, true);
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="username"></param>
		/// <param name="password"></param>
		/// <param name="email"></param>
		/// <param name="mobile"></param>
		/// <param name="loginViaEmail"></param>
		/// <param name="loginViaMobile"></param>
		/// <returns></returns>
		internal User CreateUser(String username, String password, String email, String mobile, bool loginViaEmail, bool loginViaMobile)
		{
			EdmEntities.User edmUser = EdmEntities.User.CreateUser(
				0,
				username,
				password,
				"",
				email,
				mobile,
				loginViaEmail,
				loginViaMobile,
				"",
				DateTime.Now,
				"");
			db.AddToUsers(edmUser);
			db.SaveChanges();
			return edmUser.ToUser();
		}

		/// <summary>
		/// 获取用户。
		/// </summary>
		/// <param name="username">用户名。</param>
		/// <returns>一个User对象，它表示指定的用户。</returns>
		public User GetUser(String username)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// 获取用户。
		/// </summary>
		/// <param name="email">电子邮箱。</param>
		/// <returns>一个User对象，它表示指定的用户。</returns>
		public User GetUserByEmail(String email)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// 获取用户。
		/// </summary>
		/// <param name="mobile">手机号码。</param>
		/// <returns>一个User对象，它表示指定的用户。</returns>
		public User GetUserByMobile(String mobile)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// 获取用户集合。
		/// </summary>
		/// <param name="pageIndex">页索引。</param>
		/// <param name="pageSize">页大小。</param>
		/// <returns>User对象集合。</returns>
		public IList<User> GetUsers(Int32 pageIndex, Int32 pageSize)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// 获取用户数量。
		/// </summary>
		/// <returns>用户数量。</returns>
		public Int32 GetCount()
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// 获取用户集合，匹配用户名。
		/// </summary>
		/// <param name="username">要匹配的用户名。</param>
		/// <param name="pageIndex">页索引。</param>
		/// <param name="pageSize">页大小。</param>
		/// <returns>User对象集合。</returns>
		public IList<User> FindUsers(String username, Int32 pageIndex, Int32 pageSize)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// 获取用户集合，匹配电子邮箱。
		/// </summary>
		/// <param name="email">电子邮箱。</param>
		/// <param name="username">要匹配的用户名。</param>
		/// <param name="pageIndex">页索引。</param>
		/// <param name="pageSize">页大小。</param>
		/// <returns>User对象集合。</returns>
		public IList<User> FindUsersByEmail(String email, Int32 pageIndex, Int32 pageSize)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// 获取用户集合，匹配手机号码。
		/// </summary>
		/// <param name="mobile">手机号码。</param>
		/// <param name="username">要匹配的用户名。</param>
		/// <param name="pageIndex">页索引。</param>
		/// <param name="pageSize">页大小。</param>
		/// <returns>User对象集合。</returns>
		public IList<User> FindUsersByMobile(String mobile, Int32 pageIndex, Int32 pageSize)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// 验证用户名和密码是否有效。
		/// </summary>
		/// <param name="username">用户名。</param>
		/// <param name="password">密码。</param>
		/// <returns>如果有效，返回true；否则返回false。</returns>
		public Boolean ValidateUser(String username, String password)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// 验证电子邮箱和密码是否有效。
		/// </summary>
		/// <param name="email">电子邮箱</param>
		/// <param name="password">密码。</param>
		/// <returns>如果有效，返回true；否则返回false。</returns>
		/// <exception cref="UCExceiption">未开启电子邮箱登陆。</exception>
		public Boolean ValidateUserByEmail(String email, String password)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// 验证手机号码和密码是否有效。
		/// </summary>
		/// <param name="email">手机号码。</param>
		/// <param name="password">密码。</param>
		/// <returns>如果有效，返回true；否则返回false。</returns>
		/// <exception cref="UCExceiption">为开启手机号码登陆。</exception>
		public Boolean ValidateuserByMobile(String email, String password)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// 核对用户名有效性。
		/// </summary>
		/// <param name="username">被核对的用户名。</param>
		/// <param name="errorCode">
		/// 当此方法返回时，如果结果为false，则设置对应的错误代码；否则返回null。
		/// 可能的值为ErrorCodes.InvalidUserName或ErrorCodes.UserNameAlreadyExists。
		/// </param>
		/// <returns>
		/// 如果用户名合法，则返回true；否则返回false。
		/// </returns>
		public Boolean CheckUserName(String username, out ErrorCode errorCode)
		{
			// 检查用户名字符组合有效性
			if (Regex.IsMatch(username, ""))
			{// 有效
				// 检查用户名是否已存在
				if (!this.ExistsUserName(username))
				{// 不存在
					errorCode = null;
					return true;
				}
				else
				{// 已存在
					errorCode = ErrorCodes.UserNameAlreadyExists;
					return false;
				}
			}
			else
			{// 无效
				errorCode = ErrorCodes.InvalidUserName;
				return false;
			}
		}

		/// <summary>
		/// 核对电子邮箱有效性。
		/// </summary>
		/// <param name="email">被核对的电子邮箱。</param>
		/// <param name="errorCode">
		/// 当此方法返回时，如果结果为false，则设置对应的错误代码；否则返回null。
		/// 可能的值为ErrorCodes.InvalidEmail或ErrorCodes.EmailAlreadyExists。
		/// </param>
		/// <returns>
		/// 如何电子邮箱合法，则返回true；否则返回false。
		/// </returns>
		public Boolean CheckEmail(String email, out ErrorCode errorCode)
		{
			// 检查电子邮件字符组合有效性
			if (Regex.IsMatch(email, ""))
			{// 有效
				// 检查电子邮箱是否已存在
				if (!this.ExistsEmail(email))
				{// 不存在
					errorCode = null;
					return true;
				}
				else
				{// 已存在
					errorCode = ErrorCodes.EmailAlreadyExists;
					return false;
				}
			}
			else
			{// 无效
				errorCode = ErrorCodes.InvalidEmail;
				return false;
			}
		}

		/// <summary>
		/// 核对手机号码有效性。
		/// </summary>
		/// <param name="mobile">被核对的手机号码。</param>
		/// <param name="errorCode">
		/// 当此方法返回时，如果结果为false，则设置对应的错误代码；否则返回null。
		/// </param>
		/// <returns>
		/// 如何电子手机号码，则返回true；否则返回false。
		/// </returns>
		public Boolean CheckMobile(String mobile, out ErrorCode errorCode)
		{
			// 检查手机号码字符组合有效性
			if (Regex.IsMatch(mobile, ""))
			{// 有效
				// 检查手机号码是否已存在
				if (!this.ExistsMobile(mobile))
				{// 不存在
					errorCode = null;
					return true;
				}
				else
				{// 已存在
					errorCode = ErrorCodes.MobileAlreadyExists;
					return false;
				}
			}
			else
			{// 无效
				errorCode = ErrorCodes.InvalidMobile;
				return false;
			}
		}

		/// <summary>
		/// 用户名是否存在。
		/// </summary>
		/// <param name="username">要检查的用户名。</param>
		/// <returns>如果存在，则返回true；否则返回false。</returns>
		public Boolean ExistsUserName(String username)
		{
			return db.Users.Where(p => p.UserName == username).Select(p => p.UserName).Count() > 0;
		}

		/// <summary>
		/// 电子邮箱是否存在。
		/// </summary>
		/// <param name="username">要检查的电子邮箱。</param>
		/// <returns>如果存在，则返回true；否则返回false。</returns>
		public Boolean ExistsEmail(String email)
		{
			return db.Users.Where(p => p.Email == email).Select(p => p.Email).Count() > 0;
		}

		/// <summary>
		/// 手机号码是否存在。
		/// </summary>
		/// <param name="username">要检查的手机号码。</param>
		/// <returns>如果存在，则返回true；否则返回false。</returns>
		public Boolean ExistsMobile(String mobile)
		{
			return db.Users.Where(p => p.Mobile == mobile).Select(p => p.Mobile).Count() > 0;
		}
	}
}
